跳到主要内容

[toc]

python基础八 小数据池、代码块

1.小数据池、代码块(了解,实际开发中用不到)

1.1 小数据池、代码块含义

小数据池、代码块属于python中的驻留机制,目的用于节省内存空间

代码块:一个py文件、一个函数、一个模块、一个类、交互模式(终端)下的每一行都是一个代码块

小数据池:python中的内存驻留机制,优先级比代码块低

⚠️先执行代码块然后执行小数据池

1.2 小数据池缓存机制

数字:-5256
字符串:
1.定义时内容(不包含中文、特殊符号)长度不限,内容相同,就进行驻留
2.python3.6解释器字符串进行乘法时(不包含中文、特殊符号),总长度不能超过20
3.python3.7解释器字符串进行乘法时(不包含中文、特殊符号),总长度不能超过4096

⚠️验证小数据池机制必须在终端中,不能在IDE(例如pycharm)中验证,因为IDE中是一个py文件,是一个代码块,会优先执行

1.小数据池数字验证
//-5 ~ 256验证,返回结果为True,驻留,内存空间地址相同
>>> a = -5
>>> b = -5
>>> a is b
True
>>> print (id(a),id(b))
4331026288 4331026288

>>> a = 256
>>> b = 256
>>> a is b
True
>>> print (id(a),id(b))
4331034640 4331034640

//-5 ~ 256范围外验证,返回结果为False,不驻留,内存空间地址不同
>>> a = -6
>>> b = -6
>>> a is b
False
>>> print (id(a),id(b))
140558040632912 140557772390192

>>> a = 257
>>> b = 257
>>> a is b
False
>>> print (id(a),id(b))
140558039687984 140557772390256


2.小数据池字符串验证
2.1定义内容验证
//不包含中文、特殊符号,定义时内容相同,驻留,内存空间地址相同
>>> a = "abc"
>>> b = "abc"
>>> a is b
True
>>> print (id(a),id(b))
140558040616664 140558040616664

//包含中文、特殊符号,定义时内容相同,不驻留,内存空间地址不同
>>> a = "abc#"
>>> b = "abc#"
>>> a is b
False
>>> print (id(a),id(b))
140557772689168 140557772689112

>>> a = "abc#你好"
>>> b = "abc#你好"
>>> a is b
False
>>> print (id(a),id(b))
140557772596880 140557772596688

>>> a = "abc你好"
>>> b = "abc你好"
>>> a is b
False
>>> print (id(a),id(b))
140557772596688 140557772596880

2.1字符串乘法验证(python3.6)
//不包含中文和特殊符号,总长度不超过20,驻留,内存空间地址相同
>>> a = "hehe" * 3
>>> b = "hehe" * 3
>>> print (a is b)
True
>>> print (id(a),id(b))
140557772708656 140557772708656

>>> a = "hehe" * 5
>>> b = "hehe" * 5
>>> print (a is b)
True
>>> print (id(a),id(b))
140557772718488 140557772718488 //字符串相乘,等于20时驻留


//不包含中文和特殊符号,总长度超过20,不驻留,内存空间地址不同
>>> a = "hehe" * 6
>>> b = "hehe" * 6
>>> print (a is b)
False
>>> print (id(a),id(b))
140557772714992 140557772714912


//包含中文或者特殊符号,不管总长度是否超过20,都不驻留,内存空间地址不同
>>> a = "abc#你好" * 3
>>> b = "abc#你好" * 3
>>> print (a is b)
False
>>> print (id(a),id(b))
140231892539968 140231893044000 //总长度不超过20,但是内存地址还是不同


>>> a = "abc#你好" * 5
>>> b = "abc#你好" * 5
>>> print (a is b)
False
>>> print (id(a),id(b))
140231893461712 140231893461848

1.3 代码块缓存机制

数字:-5 ~ 正无穷
字符串:
1.定义时内容长度不限,内容相同,就进行驻留
2.字符串进行乘法时(不包含中文和特殊符号),总长度不能超过20

1.代码块数字验证 (pycharm中验证)
//-5 ~ 正无穷验证,返回结果为True,驻留,内存空间地址相同
a = -5
b = -5
print (a is b)
True
print (id(a),id(b))
4453603184 4453603184

a = 1000000
b = 1000000
print (a is b)
True
print (id(a),id(b))
140434424966800 140434424966800

//-5 ~ 正无穷范围外验证,返回结果为False,不驻留,内存空间地址不同
a = -6
b = -6
print (a is b)
False
print (id(a),id(b))
140442480390000 140442480390032



2.字符串验证
2.1定义内容验证
//只要内容相同,就驻留,可以包含中文和字符串,小数据池中就不可以
a = "abc#你好"
b = "abc#你好"
print (a is b)
True
print (id(a),id(b))
140481266762928 140481266762928

2.2字符串乘法验证
//不包含中文、特殊符号,总长度不超过20,驻留,内存空间地址相同,与小数据池相同
a = "abc" * 6
b = "abc" * 6
print (a is b)
True
print (id(a),id(b))
140679911152496 140679911152496

//包含中文、特殊符号,无论总长度是否超过20,都不驻留,内存空间地址不同
a = "abc#你好" * 3
b = "abc#你好" * 3
print (a is b)
False
print (id(a),id(b))
140361947581552 140361947581216 //总长度不超过20,内存空间地址不同

a = "abc#你好" * 5
b = "abc#你好" * 5
print (a is b)
False
print (id(a),id(b))
140438049459712 140437243696104 //总长度超过20,内存空间地址不同

1.4 小数据池和代码块对比

小数据池代码块
数字-5 ~ 256 驻留-5 ~ 正无穷 驻留
字符串定义内容不能包含中文、特殊符号,长度不限,内容相同就驻留可以包含中文、特殊符号,长度不限,内容相同就驻留
字符串乘法不能包含中文、特殊符号,总长度不超过20就驻留不能包含中文、特殊符号,总长度不超过20就驻留